{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "2fbbf3e8",
   "metadata": {},
   "source": [
    "# Least Squares Filters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "21b1831f",
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "188451a3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "        <style>\n",
       "        .output_wrapper, .output {\n",
       "            height:auto !important;\n",
       "            max-height:100000px;\n",
       "        }\n",
       "        .output_scroll {\n",
       "            box-shadow:none !important;\n",
       "            webkit-box-shadow:none !important;\n",
       "        }\n",
       "        </style>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#format the book\n",
    "import book_format\n",
    "book_format.set_style()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "72ac8cbf",
   "metadata": {},
   "source": [
    "## Introduction"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1ac9428b",
   "metadata": {},
   "source": [
    "**作者注**：这是从 g-h 章节中截取的，它不属于该章节。本章尚未阅读！我还没写呢。\n",
    "\n",
    "在本章的开头，我使用了 `numpy.polyfit()` 来拟合一条直线来测量重量。它使用“最小二乘拟合”将 n 次多项式拟合到数据中。这与 g-h 过滤器有何不同？\n",
    "\n",
    "这要看情况。我们最终会了解到卡尔曼滤波器在某些条件下从最小二乘拟合的角度来看是最优的。然而，`polyfit()` 通过最小化这个公式的值来拟合数据的多项式，而不是任意曲线：\n",
    "\n",
    "$$E = \\sum_{j=0}^k |p(x_j) - y_j|^2$$\n",
    "\n",
    "我假设我的体重增加恒定为 1 磅/天，因此当我尝试拟合 $n=1$ 多项式时，这是一条直线，结果与实际体重增加非常接近。但是，当然，没有人总是只会增重或减重。我们波动。对较长的数据系列使用“polyfit()”会产生较差的结果。相比之下，g-h 过滤器对速率的变化做出反应——$h$ 项控制过滤器对这些变化的反应速度。如果我们体重增加，保持稳定一段时间，然后减肥，过滤器将自动跟踪该变化。除非收益和损失可以用多项式很好地表示，否则 'polyfit()' 将无法做到这一点。\n",
    "\n",
    "\n",
    "即使数据符合 *n* 次多项式，这种形式的过滤器的另一个优点是它是 *递归的*。也就是说，我们可以计算这个时间段的估计值，只知道上一个时间段的估计值和比率。相反，如果您深入研究“polyfit()”的实现，您会发现它需要所有数据才能产生答案。因此，像“polyfit()”这样的算法不太适合实时数据过滤。在 60 年代开发卡尔曼滤波器时，计算机速度非常慢且内存极其有限。例如，它们完全无法存储来自飞机惯性导航系统的数千个读数，也无法在提供准确和最新导航信息所需的短时间内处理所有这些数据。\n",
    "\n",
    "\n",
    "直到 20 世纪中叶，各种形式的最小二乘估计被用于这种类型的过滤。例如，美国宇航局的阿波罗计划有一个地面网络，用于跟踪指挥和服务模型 (CSM) 和登月舱 (LM)。他们在几分钟内进行了测量，将数据组合在一起，然后慢慢计算出答案。 1960 年，美国宇航局艾姆斯的斯坦利·施密特认识到鲁道夫·卡尔曼的开创性论文的实用性，并邀请他去艾姆斯。施密特将卡尔曼的工作应用于 CSM 和 LM 上的车载导航系统，并将其称为“卡尔曼滤波器”。 [1]不久之后，世界转向了这个更快的递归过滤器。\n",
    "\n",
    "卡尔曼滤波器只需要存储上次估计和一些相关参数，只需要相对较少的计算量就可以生成下一次估计。今天，我们拥有如此多的内存和处理能力，以至于这一优势变得不那么重要了，但当时卡尔曼滤波器是一项重大突破，不仅因为数学特性，还因为它可以（几乎）在当时的硬件上运行.\n",
    "\n",
    "这个主题比这个简短的讨论所暗示的要深刻得多。我们将在整本书中多次考虑这些主题。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cf0105dd",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
